package net.ib.mtalk.network.serverapi;

import com.google.protobuf.micro.ByteStringMicro;

import net.ib.mntalk.protocol.Session;
import net.ib.mtalk.network.NetResultReceiver;
import net.ib.mtalk.network.TcpClient;
import net.ib.mtalk.network.TcpEnvelope;

/**
 * Server-side API: Ping<br>
 * rpc Ping()<br>
 * @author Arngard
 */
public class Ping {
	
	/**
	 * rpc Ping()<br>
	 * 주어진 인자로 {@link TcpEnvelope}을 만들어서 네트워크 요청까지 해 주는 래퍼 메소드. 
	 * @param req 요청의 GPB 객체
	 * @param callback 결과를 받을 콜백
	 * @return 보낼 때 사용한 Request ID
	 */
	public static int ping(Session.PingReq req, NetResultReceiver callback) {
		int reVal = TcpEnvelope.getNewRequestId();

		// TcpEnvelope!
		TcpEnvelope reqEnvelope = new TcpEnvelope.Builder()
		.setRequestId(reVal)
		.setType(TcpEnvelope.REQUEST)
		.setMethodId(net.ib.mtalk.network.MethodId.Session.Ping.Ping)
		.setMessage(req)
		.setCallback(callback)
		.build();

		// Send!
		TcpClient.send(reqEnvelope);
		
		return reVal;
	}
	
	/**
	 * 클라이언트가 서버에 핑을 요청한다.
	 * @param options 핑의 내용. null 이면 내용 없는 핑이 감.
	 * @param mCallback 응답을 받을 콜백 객체
	 */
	public static void ping(byte[] options, NetResultReceiver callback) {
		// 질문 객체를 구성한다.
		Session.PingReq pingReq = new Session.PingReq();
		if (options != null) {	// 내용 있으면
			pingReq.setOptions(ByteStringMicro.copyFrom(options));	// 내용 넣고
		}

		ping(pingReq, callback);
	}

}
